package com.easyUploader.property;

import com.common.util.StringUtil;
import com.easyUploader.entity.dao.FileStorage;
import com.easyUploader.entity.vo.FileChunkVo;
import com.easyUploader.entity.vo.FileUploadCheckVo;
import com.easyUploader.threadHolder.UserThreadHolder;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.io.File;
import java.util.Objects;

import static com.security.filter.AbstractTokenAuthenticationFilter.NO_TOKEN_AUTH_REQUEST_PREFIX;

/**
 * 本地文件存储相关属性
 * @author 大忽悠
 * @create 2022/10/30 9:57
 */
@Component
@ConfigurationProperties(prefix = "uploader.file")
@Data
public class LocalFileProperty {
    //--路径相关属性

    /**
     * 默认存储路径为当前用户家目录下的easyUploader
     */
    public static final String DEFAULT_BASE_DIR=System.getProperty("user.home")+File.separator+"easyUploader";
    /**
     * 压缩文件临时存放目录--相对于base-dir而言的
     */
    public static final String DEFAULT_ZIP_TEMP_DIR = "temp/zip";
    /**
     * 默认头像存放目录
     */
    public static final String DEFAULT_HEAD_IMG_DIR = "defaultHeadImg";
    /**
     * 使用默认头像的标记: $1 --> 默认头像列表中第一张头像
     */
    private static final String DEFAULT_HEAD_IMG_TAG = "$";
    /**
     * 用户头像存放目录
     */
    public static final String USER_HEAD_IMG_DIR = "headImg";

    //--默认空间

    /**
     * 用户空间
     */
    private static final String USER_SPACE="user";
    /**
     * 系统空间
     */
    private static final String SYSTEM_SPACE="system";
    /**
     * 共享空间
     */
    private static final String SHARE_SPACE="share";

    //--分片相关属性

    /**
     * 默认的分片大小：20MB
     */
    public static final long DEFAULT_CHUNK_SIZE = 20 * 1024 * 1024;

    //--访问相关属性

    /**
     * 默认域名前缀
     */
    public static final String DEFAULT_DOMAIN_PREFIX = "http://localhost:5200";
    /**
     * 访问文件控制器的前缀请求路径
     */
    public static final String DEFAULT_VISIT_CONTROLLER_PREFIX="visit";
    /**
     * 访问共享文件控制器的前缀请求路径
     */
    public static final String DEFAULT_SHARE_VISIT_CONTROLLER_PREFIX=NO_TOKEN_AUTH_REQUEST_PREFIX+"shareVisit/";

    //--桶相关属性

    /**
     * 默认存储桶
     */
    public static final String DEFAULT_BUCKET = "default";


    //----------------------------------------------------------------------------------------------------

    /**
     * 本地文件存储的基础目录
     */
    private String baseDir=DEFAULT_BASE_DIR;
    /**
     * 分片大小
     */
    private long  chunkSize=DEFAULT_CHUNK_SIZE;
    /**
     * 压缩文件存放目录
     */
    private String zipTempDir=DEFAULT_ZIP_TEMP_DIR;
    /**
     * 域名前缀
     */
    private String domainPrefix=DEFAULT_DOMAIN_PREFIX;

    @Value("${server.servlet.context-path}")
    private String contextPath;


    //----------------------------------------------------------------------------------------------------

    public void setBaseDir(String baseDir) {
        this.baseDir = StringUtil.cleanEndFileSeparator(baseDir);
    }

    public String getZipTempDir() {
        return StringUtil.pathMerge(true,baseDir,zipTempDir);
    }

    public void setZipTempDir(String zipTempDir) {
        this.zipTempDir = StringUtil.cleanStartAndEndFileSeparator(zipTempDir);
    }

    public void setDomainPrefix(String domainPrefix) {
        this.domainPrefix = StringUtil.cleanEndFileSeparator(domainPrefix);
    }


    public String getVisitUrlPrefix(){
        return StringUtil.urlMerge(domainPrefix,contextPath,DEFAULT_VISIT_CONTROLLER_PREFIX);
    }

    public String getShareVisitUrlPrefix(){
        return StringUtil.urlMerge(domainPrefix,contextPath,DEFAULT_SHARE_VISIT_CONTROLLER_PREFIX);
    }

    /**
     * @param fileStorage 文件
     * @return 文件的访问路径
     */
    public String getFileVisitUrl(FileStorage fileStorage) {
        return StringUtil.urlMerge(getVisitUrlPrefix(),fileStorage.getFileVisitPath());
    }

    /**
     * @param fileChunkVo 分片信息
     * @return 访问文件的url <br>
     */
    public String getFileVisitUrl(FileChunkVo fileChunkVo) {
        return StringUtil.urlMerge(getVisitUrlPrefix(),fileChunkVo.getBucketName(),fileChunkVo.getDirectoryPath(),fileChunkVo.getFileName());
    }

    public String getFileOrDirVisitUrlByRelativePath(String relativePath) {
        return StringUtil.urlMerge(getVisitUrlPrefix(),relativePath);
    }

    /**
     * @param fileUploadCheckVo
     * @return 返回文件保存路径
     */
    public String getFileSavePath(FileUploadCheckVo fileUploadCheckVo) {
         return StringUtil.pathMerge(true,getBaseDir(),USER_SPACE, UserThreadHolder.get().getHomeDirName(),
                 fileUploadCheckVo.getBucketName(),fileUploadCheckVo.getDirPath(),fileUploadCheckVo.getFileName());
    }

    public String getFileSavePath(FileChunkVo fileChunkVo) {
        return StringUtil.pathMerge(true,getBaseDir(),USER_SPACE, UserThreadHolder.get().getHomeDirName(),
                fileChunkVo.getBucketName(),fileChunkVo.getDirectoryPath(),fileChunkVo.getFileName());
    }

    /**
     * 获取文件的相对路径: bucketName+dir+fileName
     */
    public String getFileRelativePath(FileChunkVo fileChunkVo) {
        return StringUtil.pathMerge(true,fileChunkVo.getBucketName(),fileChunkVo.getDirectoryPath(),fileChunkVo.getFileName());
    }

    public String getFileRelativePath(FileUploadCheckVo fileUploadCheckVo) {
        return StringUtil.pathMerge(true,fileUploadCheckVo.getBucketName(),fileUploadCheckVo.getDirPath(),fileUploadCheckVo.getFileName());
    }

    /**
      返回用户家目录路径
     */
    public String getUserHomePath(String homeDir) {
       return StringUtil.pathMerge(true,getBaseDir(),USER_SPACE,homeDir);
    }

    /**
     * 根据登录用户信息得到当前文件保存的路径
     */
    public String getFilePathByOnlineUser(String bucket, String path) {
       return StringUtil.pathMerge(true,getUserHomePath(UserThreadHolder.get().getHomeDirName()),bucket,path);
    }

    public String stripVisitUrlWithContextPathAndVisitPrefix(String requestURI) {
          return StringUtil.stripStrFromBegin(contextPath+"/"+DEFAULT_VISIT_CONTROLLER_PREFIX+"/",requestURI);
    }

    public String getUserBucketRelativePath(String bucketName) {
           return StringUtil.pathMerge(false,UserThreadHolder.get().getHomeDirName(),bucketName);
    }

    public String getUserSpacePath() {
        return StringUtil.pathMerge(true,getBaseDir(),USER_SPACE);
    }

    public String getSystemSpacePath() {
        return StringUtil.pathMerge(true,getBaseDir(),SYSTEM_SPACE);
    }

    public String getShareSpacePath() {
        return StringUtil.pathMerge(true,getBaseDir(),SHARE_SPACE);
    }

    /**
     * @param name 桶名
     * @return 桶在服务器上的完整路径
     */
    public String getBucketPath(String name) {
        return StringUtil.pathMerge(true,getBaseDir(),USER_SPACE,UserThreadHolder.get().getHomeDirName(),name);
    }

    public String getDirPath(String bucketName, String dir) {
         return StringUtil.pathMerge(true,getBucketPath(bucketName),dir);
    }

    public String getShareDirOrFilePath(String dir) {
        return StringUtil.pathMerge(true,getBaseDir(),SHARE_SPACE,DEFAULT_BUCKET,dir);
    }

    public String getShareBucketPath(String name) {
       return  StringUtil.pathMerge(true,getBaseDir(),SHARE_SPACE,name);
    }

    public String getShareFileOrDirVisitUrlByRelativePath(String relativePath) {
        return StringUtil.urlMerge(getShareVisitUrlPrefix(),relativePath);
    }

    public String stripShareVisitUrlWithContextPathAndVisitPrefix(String requestURI) {
        return StringUtil.stripStrFromBegin(contextPath+DEFAULT_SHARE_VISIT_CONTROLLER_PREFIX,requestURI);
    }

    public String getShareFileOrDirPathByRelativePath(String relativePath) {
        return StringUtil.pathMerge(true,getBaseDir(),SHARE_SPACE,relativePath);
    }

    /**
     * @return 返回默认头像目录
     */
    public String getDefaultHeadImgDirPath() {
     return StringUtil.pathMerge(true,getBaseDir(),SYSTEM_SPACE,DEFAULT_BUCKET,DEFAULT_HEAD_IMG_DIR);
    }

    /**
     * nextInt 使用默认头像的标记: $1 --> 默认头像列表中第一张头像
     */
    public String getDefaultHeadImgFileTag(int nextInt) {
        return DEFAULT_HEAD_IMG_TAG+nextInt;
    }

    public String getUserHeadImgDir() {
      return USER_HEAD_IMG_DIR;
    }

    public String getUserHeadImgFileRelativePath(String originalFilename) {
       return StringUtil.pathMerge(true,DEFAULT_BUCKET,getUserHeadImgDir(),originalFilename);
    }

    public String getUserHeadImgFilePath(String relativePath) {
        return StringUtil.pathMerge(true,getBaseDir(),USER_SPACE,UserThreadHolder.get().getHomeDirName(),relativePath);
    }

    public File getOnlineUserHeadImgFile() {
        String headImg = UserThreadHolder.get().getHeadImg();
        //判断是不是默认头像
        if(headImg.startsWith(DEFAULT_HEAD_IMG_TAG)){
            return parseDefaultHeadImg(headImg);
        }
        return new File(getUserHeadImgFilePath(headImg));
    }

    private File parseDefaultHeadImg(String headImg) {
        String index = StringUtil.stripStrFromBegin(DEFAULT_HEAD_IMG_TAG, headImg);
        return Objects.requireNonNull(new File(getDefaultHeadImgDirPath()).listFiles())[Integer.parseInt(index)];
    }
}
